package com.furkid.service.constant;

import java.util.HashMap;
import java.util.Objects;

/**
 * http 请求的返回结果对象
 */
public class AjaxResult extends HashMap<String, Object> {
    /**
     * 状态码名称
     */
    public static final String CODE_TAG = "code";

    /**
     * 返回消息名称
     */
    public static final String MSG_TAG = "msg";

    /**
     * 数据对象名称
     */
    public static final String DATA_TAG = "data";

    /**
     * 构建一个空的返回对象，一个空消息
     */
    public AjaxResult() {}

    /**
     * 构建一个带 code 和 msg 的消息对象
     * @param code 返回码
     * @param msg 返回消息提示
     */
    public AjaxResult(int code, String msg) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    /**
     * 初始化一个带数据带消息的 AjaxResult 对象
     * @param code 返回代码
     * @param msg 消息
     * @param object 返回对象
     */
    public AjaxResult(int code, String msg, Object object) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (Utils.isNotNull(object)) {
            super.put(DATA_TAG, object);
        }
    }

    /**
     * 初始化一个带数据不带消息的 AjaxResult 对象
     * @param code 返回代码
     * @param object 返回对象
     */
    public AjaxResult(int code, Object object) {
        super.put(CODE_TAG, code);
        if (Utils.isNotNull(object)) {
            super.put(DATA_TAG, object);
        }
    }

    /**
     * 创建一个成功的处理结果
     * @param msg 消息
     * @param object 对象
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult success(String msg, Object object) {
        return new AjaxResult(HttpStatus.OK, msg, object);
    }

    /**
     * 创建一个只带消息的成功处理消息
     * @param msg 消息
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }

    /**
     * 创建一个带数据的成功处理消息
     * @param object 数据对象
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult success(Object object) {
        return AjaxResult.success("操作成功", object);
    }

    /**
     * 创建一个警告消息
     * @param msg 警告消息
     * @param object 数据对象
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult warn(String msg, Object object) {
        return new AjaxResult(HttpStatus.WARN, msg, object);
    }

    /**
     * 创建一个带消息提示警告消息
     * @param msg 消息提示
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult warn(String msg) {
        return AjaxResult.warn(msg, null);
    }

    /**
     * 创建一个错误消息
     * @param code 错误码
     * @param msg 消息提示
     * @param object 数据对象
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult error(int code, String msg, Object object) {
        return new AjaxResult(code, msg, object);
    }

    /**
     * 创建一个不带数据的错误消息
     * @param msg 消息提示
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(HttpStatus.INTERNAL_SERVER_ERROR, msg, null);
    }

    /**
     * 创建一个带数据的错误消息
     * @param msg 消息提示
     * @param object 数据对象
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult error(String msg, Object object) {
        return AjaxResult.error(HttpStatus.INTERNAL_SERVER_ERROR, msg, object);
    }

    /**
     * 创建一个指定错误码和错误消息的消息
     * @param code 错误码
     * @param msg 消息提示
     * @return 返回一个 AjaxResult 对象
     */
    public static AjaxResult error(int code, String msg) {
        return AjaxResult.error(code, msg, null);
    }

    /**
     * 是否是成功消息
     * @return 是返回 true，否在返回 false
     */
    public boolean isSuccess() {
        return Objects.equals(HttpStatus.OK, this.get(CODE_TAG));
    }

    /**
     * 是否是警告消息
     * @return 是返回 true，否在返回 false
     */
    public boolean isWarn() {
        return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
    }

    /**
     * 是否是错误消息
     * @return 是返回 true，否在返回 false
     */
    public boolean isError() {
        return Objects.equals(HttpStatus.INTERNAL_SERVER_ERROR, this.get(CODE_TAG));
    }

    @Override
    public AjaxResult put(String key, Object object) {
        super.put(key, object);
        return this;
    }
}
